<?php

declare(strict_types=1);

namespace app\common\logic;

use app\common\lib\Alipay;
use app\common\lib\easywechat\Payment;
use app\common\model\Paylog as ModelPaylog;

class Notify
{
    // +----------------------------------------------------------
    // | 微信支付回调
    // +----------------------------------------------------------

    /**
     * 微信支付回调逻辑处理
     */
    public static function wechat()
    {
        self::getUniacid();
        $app = app(Payment::class)->app;
        $response = $app->handlePaidNotify(function ($message, $fail) {
            $paylog = ModelPaylog::where('out_trade_no', $message['out_trade_no'])->findOrEmpty();
            if ($paylog->isEmpty() || $paylog->status == 1) {
                return true;
            }
            $paylog->save([
                'status'         => 1,
                'notify_time'    => time(),
                'transaction_id' => $message['transaction_id'],
            ]);
            // 你的逻辑
            return true;
            // 或者错误消息
            $fail('Order not exists.');
        });
        $response->send();
    }

    /**
     * 将附加数据中的微擎平台相关数据保存到全局变量$_W中
     */
    private static function getUniacid()
    {
        $xml = file_get_contents('php://input');
        $obj = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
        $arr = json_decode(json_encode($obj), true);
        $paylog = ModelPaylog::withoutGlobalScope()->where('out_trade_no', $arr['out_trade_no'])->findOrEmpty();
        if (!$paylog->isEmpty() && !empty($paylog->uniacid)) {
            global $_W;
            $_W['uniacid']           = $paylog->uniacid ?? '';
            $_W['account']['key']    = $paylog->extra_data['appid'] ?? '';
            $_W['account']['secret'] = $paylog->extra_data['secret'] ?? '';
        }
    }

    // +----------------------------------------------------------
    // | 支付宝支付回调
    // +----------------------------------------------------------

    /**
     * 支付宝支付回调逻辑处理
     */
    public static function alipay()
    {
        self::alipayInit();
        $alipay = app(Alipay::class)->alipay;
        try {
            // 验签
            $data = $alipay->verify();
            if (in_array($data->trade_status, ['TRADE_SUCCESS', 'TRADE_FINISHED'])) {
                // 请自行对 trade_status 进行判断及其它逻辑进行判断，
                // 在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功。
                // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号；
                // 2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额）；
                // 3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）；
                // 4、验证app_id是否为该商户本身。
                // 5、其它业务逻辑情况
                writeLog('支付宝支付成功: ' . encode($data), 'payment');
            }
        } catch (\Exception $e) {
            writeLog('支付宝回调发生异常: ' . $e->getMessage(), 'payment');
        }
        return $alipay->success()->send();
    }

    /**
     * 将附加参数中的uniacid值保存到全局变量$_W中
     */
    private static function alipayInit()
    {
        $extra = queryStringToArray(input('body'));
        if (isset($extra['uniacid'])) {
            global $_W;
            $_W['uniacid'] = $extra['uniacid'];
        }
    }
}
